Проба Гаусс.
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 

(******************************************************************************)
(**)                        ОТДЕЛ ПроГаусс+;
(******************************************************************************
 * НАЗНАЧЕНИЕ:
 *   решение систем линейных уравнений (A*x=b) методом исключений Гаусса
 *
 * ПРИМЕЧАНИЯ: 
 *   В данном приложении метод применяется для решения последовательности
 *   систем Гильберта увеличивающегося порядка. Системы Гильберта имеют
 *   плохо обусловленные матрицы (определитель близок к 0), поэтому, при
 *   существующей точности вычислений, начиная с некоторого порядка системы
 *   такие матрицы будут рассматриваться алгоритмом, как вырожденные. Это
 *   произойдет после того, как определитель системы станет меньше Матем.МАШЕПС.
 ******************************************************************************)
ИСПОЛЬЗУЕТ
  Вект   ИЗ "...\Отделы\Числа\",
  Матр   ИЗ "...\Отделы\Числа\",
  МатрВВ ИЗ "...\Отделы\Числа\",
  Вывод  ИЗ "...\Отделы\Обмен\";
 
(******************************************************************************)
ЗАДАЧА Гильберт(A+:Матр.Вид; b+:Вект.Вид); 
(* Построение системы Гильберта n-го порядка
 
  A[0..n-1,0..n-1] = матрица системы: 
 
        ( 1      1/2     1/3     1/4     ... 1/n      ) 
        ( 1/2    1/3     1/4     1/5     ... 1/(n+1)  ) 
    A = ( 1/3    1/4     1/5     1/6     ... 1/(n+2)  ) 
        ( ........................................... ) 
        ( 1/n    1/(n+1) 1/(n+2) 1/(n+3) ... 1/(2N-1) ) 
 
  b[0..n-1] = вектор свободных членов: 
 
            n 
    b[i] = Sum A[i,j] 
           j=1 
 
  Тогда вектор решения будет x = [1 1 1 ... 1]  *) 
ПЕР 
  i,j,посл:ЦЕЛ; 
УКАЗ 
  посл:=РАЗМЕР(A)-1;
                       (* первая строка *) 
  A[0,0]:=1; 
  ОТ j:=1 ДО посл ВЫП 
    A[0,j]:=1/(j+1) 
  КОН; 
                       (* оставшиеся строки *) 
  ОТ i:=1 ДО посл ВЫП 
                           (* последний столбец *) 
    A[i,посл]:=1/(посл+i+1); 
                           (* заполнить матрицу *) 
    ОТ j:=0 ДО посл-1 ВЫП 
      A[i,j]:=A[i-1,j+1]
    КОН 
  КОН; 
                           (* вектор постоянных членов *) 
  ОТ i:=0 ДО посл ВЫП 
    b[i]:=0; 
    ОТ j:=0 ДО посл ВЫП 
      b[i]:=b[i]+A[i,j]
    КОН 
  КОН 
КОН Гильберт; 
 
(******************************************************************************)
ЗАДАЧА Голова;
ПЕР 
  n:ЦЕЛ;          (* порядок системы         *) 
  A :Матр.Доступ; (* матрица системы         *) 
  Ao:Матр.Доступ; (* обратная матрица        *) 
  b :Вект.Доступ; (* вектор свободных членов *) 
  x :Вект.Доступ; (* вектор решения          *) 
УКАЗ
  n:=2; 
  КОЛЬЦО
    Вывод.ЧЦел("^Порядок системы: %d^",n,0,0,0);
    СОЗДАТЬ(A,n,n);
    СОЗДАТЬ(Ao,n,n);
    СОЗДАТЬ(b,n);
    СОЗДАТЬ(x,n);
    Гильберт(A^,b^);
    ЕСЛИ n < 7 ТО
      Вывод.Цепь("^Матрица системы:^");
      МатрВВ.ВыводМатр("%8.4f",A^);
      Вывод.Цепь("^Свободные члены:^");
      МатрВВ.ВыводВект("%8.4f",b^)
    КОН;
    ЕСЛИ Матр.МетодГаусса(A^,b^,Ao^,x^) = 0 ТО
      Вывод.Цепь("^Вектор решения:^");
      МатрВВ.ВыводВект("%8.4f",x^);
    ИНАЧЕ
      Вывод.Цепь("^Вырожденная матрица!^");
      ВЫХОД
    КОН;
    УВЕЛИЧИТь(n)
  КОН
КОН Голова;

(******************************************************************************)
УКАЗ
  Голова
КОН ПроГаусс. 




Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
 email
 
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы